/*
* Controlador del sudoku.
*/
package sudoku.Controlador;
import java.awt.Color;
import java.awt.Component;
import java.awt.Desktop;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.*;
import sudoku.Extras.Archivo;
import sudoku.Extras.Puntaje;
import sudoku.Modelo.*;
import sudoku.Vista.*;
public class SudokuControlador implements ActionListener,MouseListener {
private Juego juego; //Juego Corriente
private SudokuPanel sudokuPanel; //Panel A controlar.
private Puntaje puntaje;
private int vista;
private JFrame vistActual;
/**
* Constructor.
*
* @param vista vista elegida.
*/
public SudokuControlador(int vista) {
juego = new Juego();
sudokuPanel = new SudokuPanel();
this.vista = vista;
if (this.vista == 1){
vistActual = new SudokuVista1(juego, sudokuPanel, this, true);
}else{
vistActual = new SudokuVista2(juego, sudokuPanel, this, true);
}
}
/**
* Realiza accion despues de los eventos del usuario.
*
* @param e ActionEvent.
*/
public void actionPerformed(ActionEvent e) {
String AccComando = e.getActionCommand();
if ("Nuevo".equals(AccComando) || "Facil".equals(AccComando) || "Medio".equals(AccComando) || "Dificil".equals(AccComando) ){
switch (AccComando) {
case "Nuevo":
juego.nuevoJuego(juego.getDificultad());
break;
case "Facil":
juego.nuevoJuego(1);
break;
case "Medio":
juego.nuevoJuego(2);
break;
case "Dificil":
juego.nuevoJuego(3);
break;
}
puntaje = new Puntaje();
}
else {
switch (AccComando) {
case "Chequear":
juego.comprobarJuego();
break;
case "Ayuda":
juego.setAyuda(((JCheckBoxMenuItem) e.getSource()).isSelected());
break;
case "Top 10 Facil":
Puntaje.mostrarPuntaje(1);
break;
case "Top 10 Medio":
Puntaje.mostrarPuntaje(2);
break;
case "Top 10 Dificil":
Puntaje.mostrarPuntaje(3);
break;
case "Guardar":
Archivo.GuardarObjeto(juego);
break;
case "Abrir":
Archivo.CargarObjeto(juego);
break;
case "Resolver":
juego.finalizar();
JOptionPane.showMessageDialog(null, "Juego Terminado");
break;
case "Cambiar de Vista":
vistActual.dispose();
if (this.vista == 1){
this.vista = 2;
vistActual = new SudokuVista2(juego, sudokuPanel, this, false);
}else{
this.vista = 1;
vistActual = new SudokuVista1(juego, sudokuPanel, this, false);
}
break;
case "Otros Sudokus":
try {
Desktop.getDesktop().browse(new URI("http://www.sudokumania.com.ar/"));
} catch (URISyntaxException | IOException ex) {}
break;
case "Regla":
VistaReglas vr = new VistaReglas();
break;
case "Acerca De":
VistaAcercaDe vad = new VistaAcercaDe();
break;
default:
juego.setNumSeleccionado(Integer.parseInt(e.getActionCommand()));
break;
}
}
}
/**
* Recupera el evento si el usuario hace click en un campo del juego.
* Si hace click con el boton principal con un numero seleccionado setea ese valor en el campo.
* Si hace click con el boton secundario limpia el campo.
* Siempre verifica si se llego al final o no.
*
* @param e MouseEvent.
*/
public void mousePressed(MouseEvent e) {
if (sudokuPanel.isEnabled()){
JPanel panel = (JPanel)e.getSource();
Component component = panel.getComponentAt(e.getPoint());
if (component instanceof Campo) {
Campo campo = (Campo) component;
int x = campo.getCampoX();
int y = campo.getCampoY();
if (vista ==1 && e.getButton() == MouseEvent.BUTTON1 && (juego.getNumero(x, y) == 0 || campo.getForeground().equals(Color.BLUE))) {
int numero = juego.getNumSeleccionado();
if (numero == -1)
return;
juego.setNumero(x, y, numero);
campo.setNumero(numero, true);
}
if (vista == 2 && e.getButton()== MouseEvent.BUTTON1){
int numero = juego.getNumero(x, y);
if (numero == 0){
juego.setNumero(x, y, 1);
campo.setNumero(1, true);
juego.setNumSeleccionado(1);
}
else{
if(campo.getForeground().equals(Color.BLUE)){
if (numero==9){
juego.setNumero(x, y, 1);
campo.setNumero(1, true);
}
else{
numero++;
juego.setNumero(x, y, numero);
campo.setNumero(numero, true);
}
}
}
} //
else if (e.getButton() == MouseEvent.BUTTON3 && !campo.getForeground().equals(Color.BLACK)) {
juego.setNumero(x, y, 0);
campo.setNumero(0, false);
}
if(juego.comprobarJuego()){
try{
JOptionPane.showMessageDialog(null, "Juego Terminado");
sudokuPanel.setEnabled(false);
puntaje.finalizarPuntaje(juego.getDificultad());
} catch(Exception ex){}
}
sudokuPanel.update(juego, "Candidatos");
}
}else{
JOptionPane.showMessageDialog(null, "Juego Terminado");
}
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
@Override
public void mouseEntered(MouseEvent e) {}
@Override
public void mouseExited(MouseEvent e) {}
}